package cmd

import (
	"flag"
	"gitee.com/gopher2011/godemo/config"
	"gitee.com/gopher2011/godemo/logger"
	"gitee.com/gopher2011/godemo/test/service"
	"github.com/polaris1119/keyword"
	"github.com/robfig/cron"
	"time"
)

// 项目初始化
func Index() {
	logger.Init(config.Root+"/log", config.Config.MustValue("global", "log_level", "DEBUG"))
	// 提取中文关键字
	go keyword.Extractor.Init(keyword.DefaultProps, true, config.Root+"/data/programming.txt,"+config.Root+"/data/dictionary.txt")
	Server()
}

var (
	// 手册
	manual    = flag.Bool("manual", false, "是否手动索引一次")
	need      = flag.Bool("all", false, "是否需要全量抓取，默认否")
	whichSite = flag.String("site", "", "抓取哪个站点(空表示所有站点)")
)

func index(isAll bool) {
	logger.Infoln("初始化开始")

	start := time.Now()
	defer func() {
		logger.Infoln("初始化花费时间", time.Now().Sub(start))
	}()
	service.DefaultSearch.Index(isAll)
}

func Server() {
	if !flag.Parsed() {
		flag.Parse()
	}

	if *manual {
		index(true)
	}

	// 开启定时任务
	c := cron.New()
	// 构建 solr 需要的索引数据
	// 1 分钟一次增量
	c.AddFunc("@every 1m", func() {
		index(false)
	})

	// 一周一次全量（周六晚上2点开始）
	c.AddFunc("0 0 2 * * 6", func() {
		index(true)
	})
	c.Start()
}

func autoCrawl(needAll bool, whichSite string) {
	if needAll {
		if whichSite != "" {
			go service.DefaultAutoCrawl.CrawlWebsite(whichSite, needAll)
		} else {
			go service.DefaultAutoCrawl.DoCrawl(needAll)
		}
	}

	//定时增量
	c := cron.New()
	c.AddFunc(config.Config.MustValue("crawl", "spec", "0 0 */1 * * ?"), func() {
		// 抓取 reddit 网站上最新的 go 资讯
		go service.DefaultReddit.Parse("")

		projectURL := config.Config.MustValue("crawl", "project_url")
		if projectURL != "" {
			go service.DefaultProject.ParseProjectList(projectURL)
		}

		// 抓取 文章
		go service.DefaultAutoCrawl.DoCrawl(false)
	})
	c.Start()
}

// 爬虫服务
func crawl() {
	if !flag.Parsed() {
		flag.Parse()
	}
	go autoCrawl(*need, *whichSite)
}

func Crawl() {
	logger.Init(config.Root+"/log", config.Config.MustValue("global", "log_level", "DEBUG"), "crawl")
	go keyword.Extractor.Init(keyword.DefaultProps, true, config.Root+"/data/programming.txt,"+config.Root+"/data/dictionary.txt")
	crawl()
}
